<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Class</title>
</head>
<body>
    <img src="img/demo2_1.png">   
</body>
<script>
/*一个标准的类*/
// var Book=function(id,bookname,price){ //再次强调，js因为是弱语言，没有class，所以类定义时，默认首字母大写，而普通函数首字母小写
//     //这个函数一般被叫做构造器。构造器中赋值的属性和方法，一般是一些独立性的属性或方法，即当使用new创建实例时，每个不同实例的这些属性和方法，都不一样。
//     this.id = id;
//     this.bookname = bookname;
//     this.price = price;
// }

// /*prototype是类的原型。所有通过new实例化出来的对象，可通过console.log打印查看其__proto__，均指向的是该类的prototype。这样就让我们能够把一些通用的
// 属性或者方法直接放在这里。而不会导致内存的使用冗余*/
// //例如下面这个display方法。每本书展示都是显示书名，所以我们把它放在prototype中。
// Book.prototype={
//     constructor:Book, //如果不设置的话，constructor为Object。修改prototype会改变constructor的指向
//     display:function(){
//         console.log(this.name);
//     }
// }

// //使用这种方式修改prototype时，不需要重新设置constructor
// Book.prototype.display=function(){
//     console.log(this.name);
// }

// //实例化对象
// var book = new Book(10,'js',50);
// console.log(book);
// console.log(book.constructor);
/************************************************************************************************************************/

/*JS身为弱语言，没有private，public等关键字，但是其作用域特性能让它轻易实现这些关键字想要达到的效果*/
// var Book=function(id,bookname,price){ 
//     //私有属性和方法
//     /*解释：由于类在new时，只会复制this下的属性方法，所以在构造函数内，定义的变量和函数，在new的时候是无法获得的*/
//     var num=1;
//     function checkId(){
//         console.log("实例用不了我");
//     }

//     //特权方法
//     /*解释:通过特权方法，可以修改本来没有暴露出去的私有属性和方法，当然也可以把被复制出去的公有属性方法进行修改，权限极大*/
//     this.getNum = function(){
//         return num;
//     }
//     this.setNum = function(n){
//         num = n;
//     }

//     //对象公有属性方法
//     /*这个不需要多讲，在new时会复制一份给示例，是人都能看到，当然公有了*/
//     this.id = id;
//     this.copy = function(){
//         console.log("复制一本");
//     };

//     //构造器
//     /*解释：把复制函数化，用的较少，一般如this.id = id一般直接复制就行*/
//     this.getNum();
//     this.setNum(num);
// }

// //类静态公有属性方法
// /*解释：在Book内部可用，但实例化对象无法访问*/
// Book.isChinese = true;
// Book.resetTime = function(){
//     console.log('new Item');
// };

// Book.prototype={
//     //公有属性
//     /*解释:这个是最大公无私的了，每个实例化对象用的都是它，类用的也是它，它好，大家都好，它出错，大家都出错*/
//     isJsBook : false,
//     display:function(){
//         console.log(this.name);
//     }
// }

// //实例化
// /*这些结果自己尝试体会咯~*/
// var b = new Book(11,"js",50);
// console.log(b.num);
// console.log(b.isJsBook);
// console.log(b.id);
// console.log(b.isChinese);

// console.log(Book.isChinese);
// Book.resetTime();


</script>
</html>